package bancosys.tec.query;

import java.util.List;

import org.hibernate.Session;

import bancosys.tec.query.exception.QueryParameterException;

/**
 * @author frank
 * @deprecated
 */
@Deprecated
public interface QueryParameter {

    int EXPRESSION_EQUAL = 0;

    int EXPRESSION_LIKE = 1;

    int EXPRESSION_NOT_EQUALS = 2;

    int EXPRESSION_GREATER_OR_EQUAL = 3;

    int EXPRESSION_LESS_OR_EQUAL = 4;

    /**
     * Define o bean.
     * 
     * @param obj o bean.
     */
    void setBean(Object obj);

    /**
     * Adiciona o BO a query.
     * 
     * @param bo o business object.
     */
    void addBO(Object bo);

    /**
     * Adiciona uma expressão a query. (like, equal, etc)
     * 
     * @param property - nome da propriedade do BO
     * @param value - valor da propriedade que deve ser usado na query
     * @param expression - tipo da expressão, use as contantes da interface QueryParameter
     */
    void addPropertyForExpression(String property, Object value, int expression);

    /**
     * Adiciona uma ordenacao a pesquisa. Em ordenacao decrescente por padrao.
     * 
     * @param property campo a ser usado para ordenacao.
     * @return devolve o proprio objeto pra poder ser usado de forma encadeada (eg. foo.addOrderBy(...).addOrderBy(...))
     */
    QueryParameter addOrderBy(String property);

    /**
     * Adiciona uma ordenacao a pesquisa. Podendo escolher se crescente ou decrescente.
     * 
     * @param property campo a ser usado para ordenacao.
     * @param desc <code>true</code> para decrescente, <code>false</code> para crescente.
     * @return devolve o proprio objeto pra poder ser usado de forma encadeada (eg. foo.addOrderBy(...).addOrderBy(...))
     */
    QueryParameter addOrderBy(String property, boolean desc);

    /**
     * Adiciona uma expressão de "between"
     * 
     * @param property - nome da propriedade do BO
     * @param valueSt - valor inicial
     * @param valueEnd - valor final
     */
    void addBetween(String property, Object valueSt, Object valueEnd);

    /**
     * Adiciona uma expressão do tipo "IN".
     * 
     * @param propery a propriedade.
     * @param values os valores.
     */
    void addIn(String propery, Object[] values);

    /**
     * Executa a query.
     * 
     * @param session a sessão.
     * @return Collection - resultado da execução da query.
     * @throws QueryParameterException - Erro na execução da query.
     */
    List<?> executeQuery(Session session) throws QueryParameterException;
}
